package offer18

import node.ListNode
import node.ListNodeManager

/**
 * 剑指 Offer 18. 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值，定义一个函数删除该节点。

返回删除后的链表的头节点。

注意：此题对比原题有改动

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点，那么在调用了你的函数之后，该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点，那么在调用了你的函数之后，该链表应变为 4 -> 5 -> 9.
 

说明：

题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言，你不需要 free 或 delete 被删除的节点
 * **/
class Solution {
    companion object {
        @JvmStatic
        fun main(s: Array<String>) {
            val array: IntArray = intArrayOf(4, 5, 1, 9)
            var head: ListNode? = ListNodeManager.createListNodeByArray(array)

            ListNodeManager.printlnNode(deleteNode2(head, 1))

        }

        private fun deleteNode(head: ListNode?, kval: Int): ListNode? {
            var root = ListNode(0)
            root.next = head
            var tempt: ListNode = root

            while (root.next != null) {
                if (root.next.`val` == kval) {
                    root.next = root.next.next
                } else {
                    root = root.next
                }
            }
            return tempt.next
        }

        private fun deleteNode2(head: ListNode?, kval: Int): ListNode? {
            if (head == null)
                return head
            if (head.`val` == kval) {
                return head.next
            }
            head.next = deleteNode2(head.next, kval)
            return head
        }
    }
}